import axios from 'axios'

// 引入store vuex数据
import store from '@/store'

// 引入router
import router from '@/router'
const request = axios.create({
  baseURL: 'http://edufront.lagounews.com'
})

// 设置请求拦截器进行鉴权接口
export default request
request.interceptors.request.use(config => {
  // console.log(store.state)
  const { user } = store.state
  // 检测user是否存在
  if (user && user.access_token) {
    config.headers.Authorization = user.access_token
  }
  return config
})

// 封装跳转函数
function redirectLogin () {
  // 跳转到登录页并且存储当前的fullPath
  router.push({
    name: 'login',
    query: {
      // 将本次路由的fullPath传给login currentRoute存储了路由信息的对象
      redirect: router.currentRoute.fullPath
    }
  })
}

// 发送刷新请求时，标记刷新token
let isRefreshing = true
// 标记刷新时等待的请求
let requests = []

// 响应拦截器
request.interceptors.response.use(response => {
  return response
}, async error => {
  // 存在响应且接收完毕 但状态码失败
  if (error.response) {
    // 检测状态码是不是401
    if (error.response.status === 401) {
      // 检测是否存在用户信息
      if (!store.stateuser) {
        // 不存在 跳到登录页面
        redirectLogin()
        // 将本次的错误信息继续抛出,让接收响应数据的函数进行操作
        return Promise.reject(error)
      }
      // 发送请求前判断 是否正在进行刷新token请求
      if (isRefreshing) {
        return requests.push(() => {
          // error.config 是失败的请求的配置对象
          request(error.config)
        })
      }
      isRefreshing = true
      // 发送请求,尝试刷新token
      const { data } = await request({
        method: 'POST',
        url: '/front/user/refresh_token',
        data: new window.URLSearchParams({
          refreshtoken: store.state.user.refresh_token
        }).toString()
      })
      if (data.state !== 1) {
        // 刷新token失败
        store.commit('setUser', null)
        // 清除用户信息之后 跳到登录页面
        redirectLogin()
        return Promise.reject(error)
      }
      // 如果刷新Token成功，将新的 access_token 更新到容器与本地存储中
      store.commit('setUser', data.content)
      // 将requests里面的所有请求重新发送
      requests.forEach(callback => callback())
      // 清除之前所有的requests请求
      requests = []
      // 请求完毕，设置标记为 false
      isRefreshing = false
      // 将本次的失败请求重新发送
      return request(error.config)
    }
  }
  return Promise.reject(error)
})
